#CalHamlet.py

#定义一个把文本内的标点符号都替换为空格的函数
def getText():
    txt = open('hamlet.txt','r').read()    #导入文档
    txt = txt.lower()    #全部变为小写，消除单词之间大小写的区别
    for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~':
        txt = txt.replace(ch,' ')    #将文本中特殊字符替换为空格
    return txt

hamletTxt = getText()  #打开并转换HamletTxt文本
words = hamletTxt.split()    #把整个文本内容分割为由单词组成的字符串words
counts = {}    #建立一个空字典counts来保存文本中的单词及其词频，单词名是key，词频是value
for word in words:    #对于文章内的每一个单词
    counts[word] = counts.get(word,0) + 1    #counts中的word键的value赋值为原值+1，默认值是0
items = list(counts.items())    #用.items()方法把字典转换为列表来记录，key是第一列，value是第二列
items.sort(key=lambda x:x[1],reverse=True)    #列表支持用.sort()方法排序，默认由小到大，输入reverse参数后改为从大到小排序
                                              #此处key用于指定排序规则，这里lambda x:x[1]起到了指定列表的第二列（即词频值）的效果
for i in range(10):
    word,count = items[i]    #输出items类表的两列
    print('{0:<10}{1:>5}'.format(word,count))
